package customer.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;


/*
 * 싱글톤 패턴 디자인 적용
 * BasicDataSourece관리
 */


public class DatabaseManager {
	
	private static DatabaseManager instance = new DatabaseManager();
	private BasicDataSource dataSource;
	/*
	 * BasicDataSource 객체는 DriverManager의 upgreade version으로 Connection Factory다.
	 * DataSource 객체는 연결할 DB에 대한 정보를 가지고 있다.
	 * 내부적으로 Connection Pool을 지원할 수 있다.
	 * 누군가 요청하면 커넥션을 생성해서 제공하며 커넥션 풀을 이용해 커넥션을 미리 생성후 요청시에 제공한다.
	 */
	
	//DB메니저와 함께 사용할 BasicDataSource 모두 한번만 객체가 생성되면 더이상 생성 할 수 없게끔 할 거니까 싱글톤 패턴을 사용한다. 
	
	private DatabaseManager(){ //프라이빗 생성자로 만들면 디폴트 생성자가 만들어지지 않고 그렇게 되면 이 클래스의 객체를 
//		외부에서 생성할 방법이 원천 봉쇄된다.
		
		dataSource = new  BasicDataSource();
		//마찬가지로 dataSource 객체도 데이타베이스메니저에서만 사용할 것이고 이 api는 오직 databaseManager만을 위해서 봉사할 것이기 때문에
		//DatabaseManager 객체가 생성되면서 동시에 객체 생선된다.
		
		//이 객체가 생성되면 이클립스 사이트에서 받은 커넥션 풀 관리를 위한 api 객체가 생성됨
		//이 데이타소스 객체는 여러가지 메소드를 갖고 있는데 그 중에 오라클 서버와의 접속을 가능하게 하는 메소드가 존재함
		dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
		dataSource.setUsername("scott");
		dataSource.setPassword("tiger");		
		//그래서 연결을 위한 기본 정보를 제공
	}
	
	
	public static DatabaseManager getInstance(){
		return instance;
	}
	
	
	public Connection getConnection() throws SQLException{
		return dataSource.getConnection();//위에 입력된 정보를 가지고 연결하는 연결을 시켜주는 커넥션 객체를 리턴
		//java.sql.connection에 정의되어 있는 커넥션 객체는 sql문을 서버에 던지고 결과값을 받기위해서 받드시 필요한 객체다. 
		//이 객체의 타입으로 외부 api를 사용하여 받아온 커넥션 객체를 반환한다. 
		//외부에서 getConncetion 메소드를 사용하면 그 순간 데이터소스에 입력한 각종 정보를 통해서 커넥션 객체를 반환한다.
		
	}
	public void close(Connection conn, PreparedStatement pstmt) throws SQLException{
		if(pstmt != null) pstmt.close();
		if(conn != null) conn.close();
	}
	public void close(Connection conn, PreparedStatement pstmt, ResultSet rset) throws SQLException{
		if(pstmt != null) pstmt.close();
		if(conn != null) conn.close();
		if(rset != null) rset.close();
	}
}
